Conditional exports
ESMやCJSなど異なる環境ごとに、異なるentry pointを指定できる
デフォルトで指定できるものは予め決まっている
指定する順序が動作に影響する
上に書いたものが優先される
例
code:package.json
"exports": {
"import": "./index-module.js",
"require": "./index-require.cjs"
},
"type": "module"
ESMでは、./index-module.jsがentry fileとして読み込まれ、
CJSでは、./index-require.cjs"がentry fileとして読み込まれる
指定できるものは予め決まっている
以下の順序、特定性の高い順に書くべき
Node.js implements the following conditions, listed in order from most specific to least specific as conditions should be defined: ref node-addons
"node"に似ており、任意のNode.js環境にマッチする
node
任意のNode.js環境にマッチする
CommonJSまたはESMファイルである可能性がある
import
importやimport()でロードされた場合などにマッチする
requireとは常に相互排他的
require
require()でロードされた場合にマッチする
コードの内容がCJSの形式でちゃんと書かれているかどうかはあまり関係ない
importとは常に相互排他的
default
汎用的なfallback
常にマッチする
常に最後に記述すべき
良く知られたものの例
types
型定義ファイルの指定
デフォルトでは、そのモジュールに対応する型定義ファイルをimportと同じようにして探すのでtypesを指定しなくても良いけど、型定義ファイルのパスがそれでは見つけられない場合にtypesを指定する必要がある。 ref browser
すべてのウェブブラウザ環境。
development
開発専用の環境エントリポイントを定義する
常にproductionと相互排他的
production
本番環境のエントリポイントを定義する
常にdevelopmentと相互排他的
これらどうしのネストもできる
ややこしいmrsekut.icon
例
Node.jsでのみdual modeのenty pointを持ち、
ブラウザでは使用しないパッケージを定義する例
code:package.json
"exports": {
"node": {
"import": "./feature-node.mjs",
"require": "./feature-node.cjs"
},
"default": "./feature.mjs"
}